/*
 * @Author      : Holy Han
 * @Date        : 2024-07-26 22:52:57
 * @LastEditTime: 2024-07-31 14:11:30
 * @LastEditors : Holy Han
 * @FilePath    : \fyne_holy\widget\label.go
 * @Description :
 */
package widget

import (
	"image/color"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/canvas"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
	wit "fyne.io/fyne/v2/widget"
	"gitee.com/hanholy1210/fyne_holy/container"
)

type Label struct {
	wit.BaseWidget

	Title string
	Value string

	height     float32
	titleWidth float32
	valueWidth float32
	titleSize  float32
	valueSize  float32
	titleColor color.Color
	valueColor color.Color
	titleStyle fyne.TextStyle
	valueStyle fyne.TextStyle

	titleCanvas *canvas.Text
	valueCanvas *canvas.Text
	titleLay    *fyne.Container
	valueLay    *fyne.Container
}

func NewLabel(value string) *Label {
	l := &Label{
		Title:      "",
		Value:      value,
		titleColor: theme.Color(theme.ColorNameForeground),
		valueColor: theme.Color(theme.ColorNameForeground),
		titleStyle: fyne.TextStyle{},
		valueStyle: fyne.TextStyle{},
	}
	l.ExtendBaseWidget(l)
	return l
}
func NewLabelWithTitle(title string, value string) *Label {
	l := &Label{
		Title:      title,
		Value:      value,
		titleColor: theme.Color(theme.ColorNameForeground),
		valueColor: theme.Color(theme.ColorNameForeground),
		titleStyle: fyne.TextStyle{},
		valueStyle: fyne.TextStyle{},
	}
	l.ExtendBaseWidget(l)
	return l
}

func (l *Label) CreateRenderer() fyne.WidgetRenderer {
	l.titleCanvas = canvas.NewText(l.Title, l.titleColor)
	l.valueCanvas = canvas.NewText(l.Value, l.valueColor)
	if l.titleSize > 0 {
		l.titleCanvas.TextSize = l.titleSize
	}
	if l.valueSize > 0 {
		l.valueCanvas.TextSize = l.valueSize
	}
	l.titleCanvas.TextStyle = l.titleStyle
	l.valueCanvas.TextStyle = l.valueStyle

	if l.titleWidth != 0 && l.height != 0 {
		l.titleLay = container.NewSize(fyne.NewSize(l.titleWidth, l.height), l.titleCanvas)
	} else if l.titleWidth != 0 {
		l.titleLay = container.NewSize(fyne.NewSize(l.titleWidth, l.titleCanvas.TextSize), l.titleCanvas)
	} else if l.height != 0 {
		l.titleLay = container.NewSize(fyne.NewSize(l.titleCanvas.MinSize().Width, l.height), l.titleCanvas)
	} else {
		l.titleLay = container.NewCenter(l.titleCanvas)
	}
	if l.valueWidth != 0 && l.height != 0 {
		l.valueLay = container.NewSize(fyne.NewSize(l.valueWidth, l.height), l.valueCanvas)
	} else if l.valueWidth != 0 {
		l.valueLay = container.NewSize(fyne.NewSize(l.valueWidth, l.valueCanvas.TextSize), l.valueCanvas)
	} else if l.height != 0 {
		l.valueLay = container.NewSize(fyne.NewSize(l.valueCanvas.MinSize().Width, l.height), l.valueCanvas)
	} else {
		l.valueLay = container.NewCenter(l.valueCanvas)
	}
	lay := container.NewHBoxNoPadding(l.titleLay, l.valueLay)
	return widget.NewSimpleRenderer(container.NewCenter(lay))
}

// SetSize 设置标签的标题和值的字体大小。
// 只在新建时用
// 参数:
//
//	t - 标题的字体大小。
//	v - 值的字体大小。
//
// 返回值:
//
//	*Label - 返回修改后的标签指针，允许链式调用。
func (l *Label) SetSize(t, v float32) *Label {
	l.titleSize = t
	l.valueSize = v
	return l
}
func (l *Label) SetTitleSize(t float32) *Label {
	l.titleSize = t
	return l
}
func (l *Label) SetValueSize(v float32) *Label {
	l.valueSize = v
	return l
}

func (l *Label) SetHeight(v float32) *Label {
	l.height = v
	return l
}

// SetWidth 设置标签的标题和值的宽度。
// 只在新建时用
// 参数 t 代表标题的宽度。
// 参数 v 代表值的宽度。
//
// 返回值是指向修改后的标签的指针，允许链式调用。
func (l *Label) SetWidth(t, v float32) *Label {
	l.titleWidth = t
	l.valueWidth = v
	return l
}
func (l *Label) SetTitleWidth(t float32) *Label {
	l.titleWidth = t
	return l
}
func (l *Label) SetValueWidth(v float32) *Label {
	l.valueWidth = v
	return l
}

// SetColor 设置标签的标题和值的颜色。
// 这个方法允许用户同时设置标签的两种不同颜色，以区分标题和值，提供更好的视觉效果。
// 只在新建时用
// 参数:
//
//	t - 标题的颜色。
//	v - 值的颜色。
//
// 返回值:
//
//	*Label - 返回修改后的标签实例，允许链式调用。
func (l *Label) SetColor(t, v color.Color) *Label {
	l.titleColor = t
	l.valueColor = v
	return l
}
func (l *Label) SetTitleColor(t color.Color) *Label {
	l.titleColor = t
	return l
}
func (l *Label) SetValueColor(v color.Color) *Label {
	l.valueColor = v
	return l
}
func (l *Label) SetStyle(t, v fyne.TextStyle) *Label {
	l.titleStyle = t
	l.valueStyle = v
	return l
}

// SetTitleStyle 设置标签的标题样式。
//
// 此方法允许开发人员自定义标签的标题呈现方式，例如字体、颜色、大小等。
// 通过这种方式，可以轻松地更改用户界面中标签标题的视觉样式，以满足不同的设计需求。
// 只在新建时用
// 参数:
//
//	s - 要应用于标签标题的文本样式。
//
// 返回值:
//
//	*Label - 返回对当前标签的引用，允许链式调用。
func (l *Label) SetTitleStyle(s fyne.TextStyle) *Label {
	l.titleStyle = s
	return l
}

// SetValueStyle 设置标签文本的样式。
//
// 这个方法允许开发者自定义标签中显示文本的样式，包括字体、颜色、大小等。
// 通过修改文本样式，可以使得标签文本更加突出或者适应特定的UI设计需求。
// 只在新建时用
// 参数:
//
//	s - 要应用到标签文本的样式。
//
// 返回值:
//
//	*Label - 返回修改后的标签实例，允许链式调用。
func (l *Label) SetValueStyle(s fyne.TextStyle) *Label {
	l.valueStyle = s
	return l
}

// UpdateValue 更新标签的显示值，并刷新画布以反映更改。
//
// 参数 v 是新值，将被设置为标签的显示文本。
//
// 返回值是指向修改后的标签实例的指针，允许链式调用。
func (l *Label) UpdateValue(v string) *Label {
	l.Value = v             // 更新标签的内部值。
	l.valueCanvas.Text = v  // 在画布上更新文本内容，与内部值保持一致。
	l.valueCanvas.Refresh() // 刷新画布以视觉上显示更新后的文本。
	return l                // 返回修改后的标签实例，允许链式调用。
}

// UpdateTitle 更新标签的标题。
//
// 参数 t 是新标题的文本内容。
// 返回值是指向修改后的标签的指针，允许链式调用。
func (l *Label) UpdateTitle(t string) *Label {
	l.Title = t             // 更新标签的内部标题字段
	l.titleCanvas.Text = t  // 更新用于显示标题的Canvas的内容
	l.titleCanvas.Refresh() // 刷新Canvas以确保标题的更改立即可见
	return l                // 返回修改后的标签指针，允许链式调用
}

// UpdateTitleColor 更新标签的标题颜色，并立即刷新标题画布。
// 该方法接收一个颜色对象c，并将其赋值给标签的titleColor字段和titleCanvas的Color字段。
// 使用Refresh方法来重新绘制标题画布，以反映颜色的更新。
// 返回值是Label的指针，允许方法调用的链接。
func (l *Label) UpdateTitleColor(c color.Color) *Label {
	// 更新标签的标题颜色
	l.titleColor = c
	// 将颜色应用到标题画布
	l.titleCanvas.Color = c
	// 刷新画布以应用新的颜色设置
	l.titleCanvas.Refresh()
	// 返回标签指针以支持方法链式调用
	return l
}

func (l *Label) UpdateValueColor(c color.Color) *Label {
	l.valueColor = c
	l.valueCanvas.Color = c
	l.valueCanvas.Refresh()
	return l
}

func (l *Label) UpdateColor(t, v color.Color) *Label {
	return l.UpdateTitleColor(t).UpdateValueColor(v)
}
